P3353 在你窗外闪耀的星星

题目描述

现在问题来了:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置 Xi 和自身的亮度 Bi一个位置可能有多颗星星。而窗户所能看到的范围是一个给出的参数 W,我们看到的星星也包括窗户边缘的星星。现在,要你求出调整窗户位置后能看到星星的亮度之和最大值。

输入格式

一行 N,W,分别代表星星的数量和窗户的宽度。

余下 N 行,输入 XiBi,代表星星的坐标和亮度。

1N1050W1051Xi1051Bi100

W=0 的情况外,W 均为 3 的奇数。

输出格式

一个数字,代表能看到星星的最大亮度和。

Solution

线段树

用线段树区间加模板即可

int a[100010];
void solve() {
    int n, w;cin >> n >> w;
    for (int i = 1;i <= n;i++) {
        int x, b;cin >> x >> b;
        a[x] += b;
    }
    build(1, 1, n);
    ll ans = 0;
    for (int i = 1;i + w - 1 <= n;i++) {
        //max(query a[i,i+w])
        ll res = query(1, i, i + w - 1);
        ans = max(ans, res);
    }
    cout << ans << '\n';
}